package com.shipwe.loans.utils

import android.util.Base64
import com.shipwe.loans.configs.ShipweConfigs
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec

object ShipweAppAesUtil {
    // 名称
    private const val AES_NAME = "AES"

    // TODO: 模式，android端默认用 AES/CBC/PKCS5Padding 与 AES/CBC/PKCS7Padding 等价
    private const val AES_MODE = "AES/CBC/PKCS5Padding"

    /**
     * 加密
     *
     * @param key 每个产品都使用不一样的key。16位、24位、32位
     * @param iv 每个产品都使用不一样的iv。固定16位
     * @param message 待加密的内容
     * @return 加密后的字符串（Base64 default | Base64.NO_WRAP编码）
     */
    private fun encrypt(key: String, iv: String, message: String): String {
        try {
            val cipher = Cipher.getInstance(AES_MODE)
            val secretKeySpec = SecretKeySpec(key.toByteArray(Charsets.UTF_8), AES_NAME)
            val ivParameterSpec = IvParameterSpec(iv.toByteArray(Charsets.UTF_8))
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec)
            val encrypted = cipher.doFinal(message.toByteArray(Charsets.UTF_8))
            return Base64.encodeToString(encrypted, Base64.DEFAULT or Base64.NO_WRAP)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

    /**
     * 加密 - TODO: 使用内部固定 key 与 iv
     *
     * @param message 待加密的内容
     * @return 加密后的字符串（Base64 default编码）
     */
    fun encryptDefault(message: String): String {
        return encrypt(ShipweConfigs.getSecretKey(), ShipweConfigs.getSecretIv(), message)
    }

    /**
     * 解密
     *
     * @param key 每个产品都使用不一样的key。16位、24位、32位
     * @param iv 每个产品都使用不一样的iv。固定16位
     * @param encryptedMessage 待解密的内容
     * @return 解密后的字符串
     */
    private fun decrypt(key: String, iv: String, encryptedMessage: String): String {
        try {
            val cipher = Cipher.getInstance(AES_MODE)
            val secretKeySpec = SecretKeySpec(key.toByteArray(Charsets.UTF_8), AES_NAME)
            val ivParameterSpec = IvParameterSpec(iv.toByteArray(Charsets.UTF_8))
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec)
            val encryptedBytes = Base64.decode(encryptedMessage, Base64.DEFAULT or Base64.NO_WRAP)
            val decrypted = cipher.doFinal(encryptedBytes)
            return String(decrypted, Charsets.UTF_8)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

    /**
     * 解密 - TODO: 使用内部固定 key 与 iv
     *
     * @param encryptedMessage 待解密的内容
     * @return 解密后的字符串
     */
    fun decryptDefault(encryptedMessage: String): String {
        return decrypt(ShipweConfigs.getSecretKey(), ShipweConfigs.getSecretIv(), encryptedMessage)
    }
}